本文章討論了處理詞彙表不完整與高基數分類特徵的問題,特別聚焦於 one-hot 編碼和雜湊方法的優缺點。one-hot 編碼導致資料稀疏和維度膨脹,對模型的效能將產生不利影響,儘管雜湊演算法可作為替代方案,但其也會面臨碰撞和分佈不均的挑戰。
在開始討論關於分類特徵的問題前,我們首先需要了解 one-hot 編碼的特性與缺陷。
one-hot 編碼指的是利用「為每個類別新增一個欄位,並以 0 和 1 表示是或否」來將分類類型的特徵轉為元組 (tuple) 或向量 (vector) 的方法,這種方法的優勢是在於特徵彼此之間不會因編碼而產生順序關係。然而,如果要以固定維度的向量來表示特徵,那便意味著僅有在處理特徵的初期就知道所有須處理的詞彙表,這種編碼方式才行得通。
由於 one-hot 編碼會為每個類別新增一個欄位,這也意味著當分類特徵符合高基數的特質時將發生兩個問題。
首先,是維度將因此暴增。請想像一下,如果每個新增一個類別就新增一個維度,那麼當分類特徵數以萬計甚至百萬計時,這個特徵的維度將因此膨脹到極度誇張的境界。
其次,當使用 one-hot 編碼時,每個特徵只會有一位為 1 ,換句話說,當特徵的維度極大,資料也將因此變得極度稀疏。這將對模型造成的問題有二,第一,距離函數將因此變得毫無意義,這將導致以距離為核心的聚類 (Clustering) 方法都無法再被使用;第二,大多 ML 模型都仰賴梯度來做最佳化 (Optimization),當資料中有很多 0 時,很容易輕易地就變得越乘越小,然後進一步造成梯度消失問題。
冷啟動指的是從還沒有任何使用者加入使用的時間點開始,這意味著後續將有新的使用者加入,他們會帶來新的、不同類型的資料,也可能隨時離開,而這一切都是我們無法預測的。
這將同時造成以上兩個問題。首先,隨時可能有新的資料進入,例如新的航空公司同意我們使用他們的資料,而新的航空公司停靠了不存在於我們之前所有的資料中的機場,這便帶來了第一個問題「詞彙表不完整」。
第二,隨著資料集逐漸擴增,分類特徵的基數也將因此大幅成長。同樣使用航空公司的例子。如果全世界有近五萬個機場,那麼這個特徵可以想見將有近五萬個零而只有一個一,首先,一個特徵的維度高達數萬便將對模型造成相當惡劣的影響,其次,這麼稀疏的特徵,常見的深度學習模型舉凡 CNN 、RNN 都將因此而無法再被使用。
這種做法是在「合理地處理不在詞彙表中的資訊」和「讓模型準確地反應分類輸入」之間權衡後的折衷。
因為冷啟動類似詞彙表不完整的問題,因此我們只就前兩個問題做說明。
如果輸入不在訓練資料集中,它的雜湊結果也會進入範圍中,所以不需要考慮容錯的問題。因為當系統收到陌生的資訊時,它會先將其轉為在雜湊集中的其他值,再進入模型中。
這一點應該很好理解,只要雜湊演算法選擇的組數夠少,那就完全不會有高基數的問題。因為就算我們的類別數以百萬計,我們也能將其轉入幾百組,甚至幾十組中。
這意味著兩個本來毫無關聯的分類特徵,在經過轉換後會被算作同一個類別。
如果分類特徵傾斜度很高,當某些分類特徵發生碰撞時,就可能造成準確度也跟著向某一個類別的特徵傾斜。儘管我們期待模型能從這個類別學到這兩個類別的特性,但事實是模型將偏向樣本量較多的那一側,進而造成這個新類別幾乎僅能代表樣本量多的類別,這意味著我們在使用這種方法時間接地加劇了資料不平衡的問題。
關於資料不平衡的討論可以參考 [Day 4] 建構 ML 系統的挑戰 — 資料品質、[Day 5] 設計模式:公平的鏡頭 (Fairness Lens)、[Day 6] 設計模式:重新平衡 (Rebalancing) 這三篇文章。
即使這種情況幾乎不太可能發生,但即使我們只有五組來表示幾百萬個分類,也存在某個雜湊組是空的的可能。
解決方案之一是使用 L2 正則化,使與空桶相關的權重趨近於零。然而,更推薦的做法是更換雜湊演算法,因為如果出現空桶這種極端情況,這往往意味著我們在選擇雜湊演算法時做出了不當的決策。
核心問題是將使兩個毫無關聯的特徵,因為字母的關係而產生虛假的關聯性。
舉例來說,我們不會說字典中兩個字母開頭都是 M 的單字,例如 miss 和 mathematics 有關係,除了數學對某些人來說的確有趣地一天不讀便思之如狂之外,這兩個單字之間毫無關聯。
儘管多數的加密雜湊演算法有均勻分布的特性,例如 MD5 和 SHA1 都將產生相當均勻的結果,但是我們必須確定它們能被唯一地僅映射到單一結果中。換句話說,我們必須確定引入的演算法並未被加鹽、不採用隨機種子。
此外,二者相同的問題都在於沒有進行模運算來削減類別的數量,這意味著儘管它們根本沒有解決高基數的問題。加密雜湊在計算之後,類別同樣還是那麼分散;逐位元編碼後的類別數量則是與原來相同,完全沒有任何變化。
這個設計模式是在特徵組數和衝突頻率中權衡,而特徵組數其實是依我們的需求決定的,答案取決於問題本身。最理想的方法是將其設為超參數,以便後續實驗最佳組數。
利用 Frequency Encoding 或 Target Encoding 來替代原始分類,例如利用機場出現的頻率作為它的編碼。在某些情況下,這樣就很足夠了,有些時候我們更需要的是尋找可替代的衍生特徵,而非原始的特徵。
在一個資料集合中,其中重複的比例很低,或者可以說包含大量的唯一值。
密碼學的專有名詞,指在雜湊前對待雜湊的內容的任意固定位置插入特定字串。
這篇文章我們仍然將逐位元編碼分類在加密中的原因是它屬於古典密碼學的一部份,例如凱薩密碼。
然而,實際上,我們通常會說逐位元編碼是編碼而非加密,原因是編碼僅是資料的格式轉換和表示方式的改變,它們是可逆的,而且通常不需要密鑰,只要知道規則就能解碼並還原回明文。但加密的主要目的是保護資料的機密性(關於機器學習系統的可用性我們曾在 [Day 10] 建構 ML 系統的挑戰 — 擴展 進行簡單地討論),而編碼卻無法實現這一點,這也是為什麼在密碼學的討論中,我們逐漸將逐位元編碼排除出加密技術範疇的原因。